package server

import (
	"encoding/json"
	"net/http"
	"path/filepath"

	"github.com/gorilla/mux"
	// "gorm.io/gorm"
	"github.com/jinzhu/gorm"
)

/*代码要求
• 建立一个 server 包，代码写在该包中
• server 包至少包含一个供外界调用的 Run 方法，能够启动运行
• server 包中尽量把不同功能写在不同的.go 文件中，多使用函数封 装，多考虑使用结构体、接口等

• 包 后台使用 Go 标准库的 net/http（看官方文档自学），使用 http.ListenAndServe(":9999", nil)启动监听
• https://pkg.go.dev/net/http#ListenAndServe 使用 Gorm 访问数据，数据库使用 MySQL 使用标准库 json 序列化 功能需求
• /，返回首页 html 内容，首页 HTML 文件放在指定目录下。如果 文件找不到返回 404（5 分）
• /students，使用 Gorm 查找 student 表，返回前 20 个学生的 id、 name、age 信息，封装成 json 数据返回到浏览器端（25 分）
得分：该 Server 启动后，用浏览器访问，返回正确的结果为正确

任务拆分

1. Run方法供外界调用
	定义方法，定义结构体
2. Gorm 数据库(mysql)访问 查表单
3. 20个学生
	结构体
	type Students struct{
		Id int
		Name string
		Age int
	}

4. 数据处理 json 反序列化

5. html文件
6. request/respone 404回显

server包
	-

*/

// Server结构体，用于管理HTTP服务器
type Server struct {
	db *gorm.DB
}

// NewServer 创建一个新服务器
func NewServer(db *gorm.DB) *Server {
	return &Server{db}
}

// Run 启动服务器方法
func (s *Server) Run() {
	router := mux.NewRouter()

	//处理首页请求
	router.HandleFunc("/", s.homeHandler).Methods("GET")

	//处理学生请求
	router.HandleFunc("/students", s.studentsHandler).Methods("GET")

	//启动监听
	http.Handle("/", router)
	http.ListenAndServe(":9999", nil)
}

// homeHandler 处理首页请求
func (s *Server) homeHandler(w http.ResponseWriter, r *http.Request) {
	//返回首页 HTML 内容
	filePath := filepath.Join("/Users/hack/GolandProjects/mage_goproject/git_pro/golang13/Prozuoye/status/", "index-gin.html")
	http.ServeFile(w, r, filePath)
}

// studentsHandler 处理学生请求
func (s *Server) studentsHandler(w http.ResponseWriter, r *http.Request) {
	//使用Gorm查询前20个学习
	var students []Student
	s.db.Limit(20).Find(&students)

	//将学生信息序列化为JSON
	studentsJSON, err := json.Marshal(students)
	if err != nil {
		http.Error(w, "Internal Server Error", http.StatusInternalServerError)
		return
	}

	//写入响应
	w.Header().Set("Content-Type", "application/json")
	w.Write(studentsJSON)

}
